package com.pkx.guide.holidays.timing;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.pkx.guide.holidays.entity.THolidaysDate;
import com.pkx.guide.holidays.key.THolidaysDateKey;
import com.pkx.guide.holidays.service.THolidaysDateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 节假日定时任务
 *
 * @Author : YangLe
 * @create 2025/8/28 15:31
 */
@Component
@Slf4j
public class THolidaysDateTiming {


    @Autowired
    private THolidaysDateService holidaysDateService;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 每天0点执行的定时任务
     * cron表达式含义：秒 分 时 日 月 周 年(可选)
     * 0 0 0 * * * 表示每天0点0分0秒执行
     */
//    @Scheduled(cron = "0 0 0 * * *")
    @Scheduled(cron = "0 0 0 * * *")
    public void syncHolidaysToRedis() {
        try {
            log.info("开始同步节假日数据到Redis");
            // 获取当天的起始时间和结束时间字符串（精确到当天00:00:00和23:59:59）
            LocalDate today = LocalDate.now();
            String todayStr = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

//            getStartTime大于等于 startOfDay getEndTime小于等于 endOfDay
            List<THolidaysDate> holidaysList = holidaysDateService.list(
                    new LambdaQueryWrapper<THolidaysDate>()
                            .eq(THolidaysDate::getDelFlg, 0)
                            .apply("DATE_FORMAT(start_time, '%Y-%m-%d') <= {0}", todayStr)
                            // 检查结束时间的年月日部分是否晚于等于今天（根据实际需求调整）
                            .apply("DATE_FORMAT(end_time, '%Y-%m-%d') >= {0}", todayStr)
            );

            if (holidaysList != null && !holidaysList.isEmpty()) {
                // 2. 清除Redis中已有的节假日数据（可选，根据实际需求）
                redisTemplate.delete(THolidaysDateKey.KEY_HOLIDAYS_ALL);

                // 3. 将新查询的数据存入Redis，设置过期时间（例如24小时）
                redisTemplate.opsForValue().set(
                        THolidaysDateKey.KEY_HOLIDAYS_ALL,
                        holidaysList,
                        24,
                        TimeUnit.HOURS
                );
                log.info("节假日数据同步到Redis成功，共" + holidaysList.size() + "条记录");
            } else {

                log.error("未查询到节假日数据，不更新Redis");
            }
        } catch (Exception e) {
            // 5. 异常处理，避免任务中断
            log.error("节假日数据同步到Redis失败：" + e.getMessage());
            e.printStackTrace();
        }
    }


}
